package com.zx.common.async.service;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

/**
 * 异步任务服务类
 * 提供通用的异步任务处理方法
 *
 * @author zhou xun
 * @since 2025-10-15
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class AsyncTaskService {

    /**
     * 使用通用线程池执行异步任务
     *
     * @param task 任务内容
     */
    @Async("generalTaskExecutor")
    public void executeGeneralTask(Runnable task) {
        try {
            task.run();
        } catch (Exception e) {
            log.error("执行通用异步任务时发生错误", e);
        }
    }

    /**
     * 使用MQ专用线程池执行异步任务
     *
     * @param task 任务内容
     */
    @Async("mqTaskExecutor")
    public void executeMqTask(Runnable task) {
        try {
            task.run();
        } catch (Exception e) {
            log.error("执行MQ异步任务时发生错误", e);
        }
    }

    /**
     * 使用高并发线程池执行异步任务
     *
     * @param task 任务内容
     */
    @Async("highConcurrencyTaskExecutor")
    public void executeHighConcurrencyTask(Runnable task) {
        try {
            task.run();
        } catch (Exception e) {
            log.error("执行高并发异步任务时发生错误", e);
        }
    }

    /**
     * 异步执行带结果返回的任务
     *
     * @param task 带返回值的任务
     * @param <T>  返回值类型
     * @return 任务执行结果
     */
    // 注意：@Async 注解的方法不能与返回值在同一方法中使用，这里仅作示例说明
    /*
    @Async("generalTaskExecutor")
    public <T> Future<T> executeTaskWithResult(Callable<T> task) {
        try {
            return new AsyncResult<>(task.call());
        } catch (Exception e) {
            log.error("执行带结果的异步任务时发生错误", e);
            throw new RuntimeException(e);
        }
    }
    */
}